package com.nd.android.u.ui.chatUiUtils;

import ims.IMSdkEntry;

import java.io.File;

import android.text.TextUtils;

import com.common.android.utils.smiley.Smiley;
import com.common.android.utils.smiley.Smileyhelper;
import com.nd.android.u.allCommonUtils.LogUtils;
import com.nd.android.u.chatUtil.ReflectUtil;
import com.nd.android.u.controller.ChatConst.MessageContentType;
import com.nd.android.u.controller.MessageConst.MessageState;
import com.nd.android.u.controller.bean.ImageMessage;
import com.nd.android.u.controller.factory.ChatDaoFactory;
import com.nd.android.u.controller.factory.MessageFactory;
import com.nd.android.u.controller.innerInterface.IDbOperation;
import com.nd.android.u.controller.innerInterface.IMessageDisplay;
import com.nd.android.u.controller.innerInterface.IUIDataSupplier;
import com.nd.android.u.controller.utils.CommonUtils;
import com.nd.android.u.ui.R;

/**
 * 消息发送工具类
 * <br>Created 2014-10-8 下午4:33:08
 * @version  
 * @author   cb		
 * @see 	 
 */
public class SendMessageUtil {
	/**
	 * SendMessageUtil.构造方法
	 * <br>Created 2014-10-8 下午4:33:29
	 */
	private SendMessageUtil(){}
	
    /**
     * 发送消息
     * <br>Created 2014-10-8 下午4:33:37
	 * @param messageContentType 消息内容类型
	 * @param data 文本消息的内容
	 * @param file 文件消息的文件（语音/图片/文件）
	 * @param time 语音消息的时长
     * @param supplier 数据提供者，用于提供具体的消息实例和发送消息对象的ID
     * @author  cb
    */
    public static void sendMessage(int messageContentType, String data, File file, int time,IUIDataSupplier supplier) {
    	IMessageDisplay message=supplier.getConcreteMessage();
    	message.setDefaultValue(supplier.getId());
	    message.setMessageContentType(messageContentType);
	    boolean isUpload=true;
		switch (messageContentType) {
		case MessageContentType.TEXT:
		    message.setDisPlayContent(data);
			isUpload=false;
			break;
		case MessageContentType.AUDIO:
			if (!setFileName(file, message)){
				return;
			}
			message.setDuration(time);
			message.setDisPlayContent(IMSdkEntry.INSTANCE.context.getString(R.string.chat_audio));
			break;
		case MessageContentType.FILE:
			if (!setFileName(file, message)){
				return;
			}
			message.setDisPlayContent(IMSdkEntry.INSTANCE.context.getString(R.string.chat_file));
			break;
		case MessageContentType.PICTURE:
			if (TextUtils.isEmpty(data)){
				//没有文本内容，即普通图片消息
				if (!setFileName(file, message)){
					return;
				}
				ImageMessage imageMessage = new ImageMessage();
		        imageMessage.setPosition(0);
		        imageMessage.setType(ImageMessage.IMAGE_TYPE);
		        imageMessage.setImgurl(file.getAbsolutePath());
		        imageMessage.setLength(file.length());
				message.getDisplayDatas().add(imageMessage);
				message.setDisPlayContent(IMSdkEntry.INSTANCE.context.getString(R.string.image_info));
			}else{
				//带文本消息，又是图片，即猫表情消息
				//这边的data存的是猫表情的id
				try {
					int id=Integer.parseInt(data);
					Smiley smiley=Smileyhelper.getInstance().getSmiley(id);
					if (smiley==null){
						LogUtils.e(LogUtils.CHAT,"send message cat fail:"+data);
						return;
					}
					ImageMessage imageMessage = new ImageMessage();
			        imageMessage.setPosition(0);
			        imageMessage.setType(ImageMessage.SMILY_TYPE);
			        imageMessage.setImgurl(id+"");
					message.getDisplayDatas().add(imageMessage);
					message.setDisPlayContent(Smiley.IMGSTART+id+Smiley.IMGEND);
					isUpload=false;
				} catch (Exception e) {
					LogUtils.e(LogUtils.CHAT,"send message cat fail:"+data);
					return ;
				}
			}
			break;
	     case MessageContentType.EVENT:
//	          String data=XmlMessageAnalyser.createEventMessage( mpspMenuInfo.type, mpspMenuInfo.key);
	            message.setOriMessage(data);
	            isUpload=false;
	            break;
		default:
			return;
		}
		message.send(isUpload);
    }
    
	/**
	 * 设置文件名
	 * <br>Created 2014-7-30 下午3:32:06
	 * @param file 文件
	 * @param message 消息
	 * @return 操作结果：如果文件不可用返回false
	 * @author  cb
	*/
	private static boolean setFileName(File file,IMessageDisplay message){
		if (file==null || !file.exists()){
			LogUtils.e(LogUtils.CHAT,"send message audio fail:null file");
			return false;
		}
    	message.setFileName(file.getName());
        message.setFilePath(file.getAbsolutePath());
        message.setTotalSize(file.length());
		return true;
	}
	
	/**
	 * 转发消息
	 * <br>Created 2014-7-30 下午4:23:38
	 * @param generateId 源消息的id
     * @param supplier 数据提供者，用于提供具体的消息实例
     * @param mainId 要发送消息的对象的ID
	 * @author  cb
	*/
	public static void repost(String generateId,IUIDataSupplier supplier) {
		//获取到被转发的消息的类型
		int type=CommonUtils.getCategoryFromGenerateId(generateId);
		//根据消息的类型获取数据对象和数据接口
		IMessageDisplay src =MessageFactory.INSTANCE.getMessage(type, "0", 0);
		if (src==null){
			return;
		}
		src.setGenerateId(generateId);
		IDbOperation db=ChatDaoFactory.getInstance().get(type);
		if (db==null || src==null){
			//异常处理
			return;
		}
		if (db.getData(src.getDbOperationSupport())){
			//查询源消息成功
			IMessageDisplay repost=supplier.getConcreteMessage();
			int groupType=repost.getMessageData().groupType;
			String gid=repost.getMessageData().groupId;
			//源消息的数据复制给待转发的消息
			ReflectUtil.copy(src, repost);
			//还原默认值
			repost.setDefaultValue(supplier.getId());
			repost.getMessageData().groupType=groupType;
			repost.getMessageData().groupId=gid;
          
		
			boolean isUpload = (repost.getExtraFlag() == MessageState.UPLOAD_FAIL);
			int messageContentType=repost.getMessageContentType();
			if (messageContentType==MessageContentType.AUDIO 	||
				messageContentType==MessageContentType.OLD_AUDIO||
				messageContentType==MessageContentType.FILE 	||
				messageContentType==MessageContentType.OLD_FILE){
				//当是转发的消息的时候，语音或者文件消息都需要上传
				isUpload=true;
				if (messageContentType==MessageContentType.AUDIO    ||
		                messageContentType==MessageContentType.OLD_AUDIO) {
				    //bug 60838 mn
				    int duration = repost.getDuration();
                    repost.setDuration(duration);
				    if (!TextUtils.isEmpty(repost.getUrl())) {
				        //bug 60846 mn
                        repost.setUrl("");
                    }
                }
				  
			}
			repost.send(isUpload);
		}		
	}
}
